package com.cskaoyan.javase.array._4operation._0traverse;

/**
 * 数组元素的遍历
 * 数组的遍历（traverse）是最最基本的操作，是进行数组中其它操作的基础。
 * 它的含义是依次访问（或输出）数组中的每一个元素。
 *
 * @since 17:02
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        // int[] arr = {1, 2, 3};
        /*System.out.println(arr[0]);
        System.out.println(arr[1]);
        System.out.println(arr[2]);*/
        // 用循环完成数组元素的遍历输出
        // 数组for循环遍历的快捷键 数组名.fori
        /*for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }*/

        int[] arr = {1, 2, 3};
        // 如果一段代码需要重复使用,比如数组元素的遍历输出,肯定是常见操作,所以可以提取出方法
        // arr = new int[0];
        // arr = null;
        traverse8(arr);
    }

    public static void traverse(int[] arr) {
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }
    }

    /*
        上述方法遍历输出打印数组元素,是可以实现功能的,但是格式不够美观
        我们希望打印元素的格式是: [1, 2, 3]
        于是需要改进这个方法
      */
    public static void traverse2(int[] arr) {
        System.out.print("[");
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + ", ");
        }
        System.out.println("]");
    }

    /*
        上述方法输出[1, 2, 3, ],已经初步达成需求了,但还有最后一个", "是多余的,如何去除呢?
            1.使用转义字符 退格"\b" 删除掉多余的地方
            2.if判断,当元素是最后一个元素时,不再加", ",而是直接输出元素即可
      */
    // 退格符的实现方式
    public static void traverse3(int[] arr) {
        System.out.print("[");
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + ", ");
        }
        System.out.println("\b\b]");
    }

    // if判断的实现方式
    public static void traverse4(int[] arr) {
        System.out.print("[");
        for (int i = 0; i < arr.length; i++) {
            // for循环中,i是作为数组下标使用的,需要判断它即可
            if (i == arr.length - 1) {
                // 说明是最后一个元素,那么直接输出它,不需要加", "
                System.out.print(arr[i]);
                break;
            }
            System.out.print(arr[i] + ", ");
        }
        System.out.println("]");
    }

    /*
        考虑更多的细节问题:
            如果方法传入的数组不是正常数组:
                长度为0的数组
                null数组
            那么这些方法还能够正常运行吗?
     */
    // 改进方向一: 当方法传入长度为0的数组时,要求给出友好的提示,不打印任何数组相关内容
    public static void traverse5(int[] arr) {
        /*if (arr.length == 0){
            System.out.println("您输入的数组是一个长度为0的数组,请重新输入!");
            return;
        }*/
        if (arr.length != 0) {
            System.out.print("[");
            for (int i = 0; i < arr.length; i++) {
                System.out.print(arr[i] + ", ");
            }
            System.out.println("\b\b]");
            return;
        }
        System.out.println("您输入的数组是一个长度为0的数组,请重新输入!");
    }

    // 比起上述判断长度!=0的方式,判断==0,代码更加简洁明了,更推荐使用判断==0的方式
    public static void traverse6(int[] arr) {
        if (arr.length == 0) {
            System.out.println("您输入的数组是一个长度为0的数组,请重新输入!");
            return;
        }
        System.out.print("[");
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + ", ");
        }
        System.out.println("\b\b]");
        return;
    }

    // 改进二: 使得方法能够接收null数组的输入,同样给出友好提示,不打印任何数组相关信息
    public static void traverse7(int[] arr) {
        // 同样if判断数组为null,单独处理
        if (arr == null) {
            System.out.println("您输入的数组是一个null数组,请重新输入!");
            return;
        }
        if (arr.length == 0) {
            System.out.println("您输入的数组是一个长度为0的数组,请重新输入!");
            return;
        }

        System.out.print("[");
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + ", ");
        }
        System.out.println("\b\b]");
    }

    // 改进三: 同时处理数组长度为0和null数组的情况,给出友好提示,不打印任何数组相关信息
    public static void traverse8(int[] arr) {
        // 同时处理两种不正常数组的情况
        if (arr == null || arr.length == 0){
            System.out.println("您输入的数组不是正常数组,请您重新输入!");
            return;
        }
        System.out.print("[");
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + ", ");
        }
        System.out.println("\b\b]");
    }

}
